
import javax.swing.JOptionPane;


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author nomes....
 */
class ArvoreBinariaBusca implements InterfaceExercicio5{

    NoArvoreBinaria raiz;
    
    public void addAll(Veiculo[] vetor) {
        for( Veiculo v: vetor ){
            this.raiz = insereOrdenado(raiz, v);
        }
    }
    
    public NoArvoreBinaria insereOrdenado(NoArvoreBinaria no, Veiculo valor){
        if( no == null ){
            no = new NoArvoreBinaria(valor);
            no.esq = null;
            no.dir = null;
        }else{
            if( valor.compareTo(no.valor) < 0 ){
                no.esq = insereOrdenado(no.esq, valor);
            }else{
                no.dir = insereOrdenado(no.dir, valor);
            }
        }
        return no;
    }
    
    @Override
    public Veiculo getMenorPlaca() {
        return pesquisaMenorPlaca(raiz);
    }

    public Veiculo pesquisaMenorPlaca(NoArvoreBinaria no){
        if( no.esq != null ){
            return pesquisaMenorPlaca(no.esq);
        }else{
            return no.valor;
        }
    }
    
    @Override
    public Veiculo getMaiorPlaca() {
        return pesquisaMaiorPlaca(raiz);
    }

    public Veiculo pesquisaMaiorPlaca(NoArvoreBinaria no){
        if( no.dir != null ){
            return pesquisaMaiorPlaca(no.dir);
        }else{
            return no.valor;
        }
    }
    
    @Override
    public Veiculo pesquisa(String placa) {
        return this.raiz.pertence(placa);
    }

    @Override
    public Veiculo[] localizaMaisAntigo(){
        int menor = 99999;
        
        ListaEncadeada listaenc = new ListaEncadeada();
        
        menor = pesquisaMenorAno(this.raiz, menor);
        
        pesquisaTodosDoMenorAno(this.raiz, menor, listaenc);
        
        ElementoLista proximo = listaenc.getPrimeiro();
        
        Veiculo[] retorno = new Veiculo[listaenc.getTamanho()];
        
        int i = 0;
        
        while( proximo != null ){
            if( proximo.getInformacao() != null){  
                retorno[i] = proximo.getInformacao();
                i++;
            }
            proximo = proximo.getProx();
        }
        
        return retorno;
    }
    
    public void pesquisaTodosDoMenorAno(NoArvoreBinaria no, int ano, ListaEncadeada lista){
        if( no != null ){
            
            if( no.valor.getAno() == ano ){
                lista.insere(no.valor);
            }
            
            if( no.esq != null ){
                pesquisaTodosDoMenorAno(no.esq, ano, lista);
            }
            
            if( no.dir != null ){
                pesquisaTodosDoMenorAno(no.dir, ano, lista);
            }
        }
    }
    
    public int pesquisaMenorAno(NoArvoreBinaria no, int menor){
        if( no != null ){
            
            int teste;
            
            if( no.valor.getAno() < menor ){
                menor = no.valor.getAno();
            }
            
            if( no.esq != null ){
                 teste = pesquisaMenorAno(no.esq, menor);
                if( teste < menor ){
                    menor = teste;
                }
            }
            
            if( no.dir != null ){
                teste = pesquisaMenorAno(no.dir, menor);
                if (teste < menor){
                    menor = teste;
                }
            }
            
            return menor;
        }else{
            return 99999;
        }
    }
    
    
}